package com.winner.data.util;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.baomidou.mybatisplus.core.toolkit.StringPool;

import cn.hutool.core.lang.Validator;
import cn.hutool.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j;

/**
 * 预编译正则校验(预编译正则,可以防止内存泄漏) 也可以使用 idea-any-rule插件 alt+a呼出, 将前后的//去掉即可使用
 *
 * @author wangxinle5
 * @since 2022-11-28
 */
@Slf4j
public class ValidateUtil {


    /**
     * 匹配零次或多次的逗号后跟一个或多个字母、数字或下划线的模式  定义一个逗号隔开的正则表达式
     */
    private static final Pattern STR_COMMA_REG = Pattern.compile("^\\w+(,\\w+)*$");

    /**
     * 以main. 或 patch.开头, .obb结尾的正则, \\.表示转义   .* 表示匹配任意字符零次或多次
     */
    private static final Pattern APP_REG = Pattern.compile("^(main|patch)\\..*\\.obb$");

    /** 该日期正则不是最严格的,但也足够使用了(无法阻止类似"2023/02/30"这样的非法日期) 0?表示前导的零是可选的 */
    public static final Pattern DATE_SLASH_REG = Pattern.compile("^\\d{4}/(0?[1-9]|1[0-2])/(0?[1-9]|[12][0-9]|3[01])$");

    public static final Pattern DATE_TIME_DASH_REG = Pattern
        .compile("^\\d{4}-(0?[1-9]|1[0-2])-(0?[1-9]|[1-2]\\d|3[0-1]) (0?\\d|1\\d|2[0-3]):([0-5]\\d):([0-5]\\d)$");

    /**
     * 日期格式是否符合yyyy/MM/dd的正则
     *
     * @param dateString 日期字符串
     * @return 返回结果
     */
    public static boolean isValidDate(String dateString) {
        if (StrUtil.isBlank(dateString)) {
            return true;
        }
        return DATE_SLASH_REG.matcher(dateString).matches();
    }

    /**
     * 日期格式是否符合yyyy-MM-dd HH:mm:ss
     *
     * @param datetimeString 时间字符串
     * @return 返回结果
     */
    public static boolean isValidDateTime(String datetimeString) {
        if (StrUtil.isBlank(datetimeString)) {
            return true;
        }
        return DATE_TIME_DASH_REG.matcher(datetimeString).matches();
    }

    private static final String NUMBER_END = "[0-9]+$";

    /**
     * 构建动态的正则表达式
     *
     * @param pinYinName 每次都不一样, 所以要动态正则
     * @param pinYinNameInDb 数据库的pinYinName
     * @return
     */
    public static Boolean allpinYinNameMatch(String pinYinName, String pinYinNameInDb) {
        if (pinYinName.equalsIgnoreCase(pinYinNameInDb)) {
            return true;
        }
        String regex = StringPool.HAT + Pattern.quote(pinYinName) + NUMBER_END;
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(pinYinNameInDb);
        return matcher.matches();
    }

    public static void main(String[] args) {
        boolean matches = STR_COMMA_REG.matcher("1B,2c,d2").matches();
        System.out.println(matches);

        boolean flag = isValidDate("2023/05/12");
        System.out.println(StrUtil.format("yyyy/MM/dd 日期格式校验通过吗? {}", flag));

        boolean flag1 = isValidDateTime("2023-04-1 02:12:00");
        System.out.println(StrUtil.format("yyyy-MM-dd HH:mm:ss 日期格式校验通过吗? {}", flag1));

        boolean flag2 = APP_REG.matcher("main.123.obb").matches();
        System.out.println(StrUtil.format("APP_REG 结果 {}", flag2));

        // hutool-all使用5.7.13以上版本
        // 现在支持大陆15位、18位身份证，港澳台10位身份证。源码就是 IdcardUtil.isValidCard("");
        // 台湾身份证: A123456789 香港身份证: P103265(1) 澳门身份证:1000248(3)
        boolean citizenId = Validator.isCitizenId("1000248(3)");
        System.out.println(citizenId);

        // 校验手机号是否合规
        boolean mobile = Validator.isMobile(null);
        System.out.println(mobile);

        boolean a = Validator.isEmail("51940196@qq.com");
        System.out.println(a);
        boolean s = Validator.hasChinese(null);
        System.out.println(s);

        boolean b = Validator.hasNumber("2012-12");
        System.out.println("包含数字了吗?" + b);

        Boolean b1 = allpinYinNameMatch("zhangli", "zhanglin44");
        System.out.println(b1);

    }

}
